package com.xlh.proxy.client;

import com.xlh.proxy.service.OrderService;
import com.xlh.proxy.service.OrderServiceImpl;
import com.xlh.proxy.service.TimerInvocationHandler;
import com.xlh.proxy.util.ProxyUtil;

import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        //创建目标对象
        OrderService target = new OrderServiceImpl();
        //创建代理对象
        /*
        1 newProxyInstance 翻译为，新建代理对象
        2 关于newProxyInstance方法的三个重要的参数，每一个什么含义？有什么用？
        第一个参数，ClassLoader loader，
            在内存中生成的字节码也是class文件，要执行也得先加载到内存中，加载类就需要类加载器，
            所以这里需要指定类加载器，并且jdk要求，目标类的类加载器必须和代理的类的类加载器使用同一个
        第二个参数 Class<?>[] interfaces,
            代理类和目标类要实现同一个或者同一些接口，在内存中生成代理类的时候，这个代理类时需要你告诉
            它实现哪些接口的
        第三个参数 InvocationHandler h
            被翻译为，调用处理器，是一个接口，在调用处理器接口中编写的就是，增强代码，因为具体要增强
            什么代码，jdk动态代理技术是猜不到的
            既然是接口，就得写实现类

        * */
//        OrderService proxyObj =
//                (OrderService)Proxy.newProxyInstance(target.getClass().getClassLoader(),
//                        target.getClass().getInterfaces(),
//                        new TimerInvocationHandler(target));
        OrderService proxyObj = (OrderService)ProxyUtil.newProxyInstance(target);
        //调用代理对象的代理方法
        proxyObj.generate();
        String name = proxyObj.getName();
        System.out.println(name);
    }
}
